package com.rskj.cashbook.service;

import com.rskj.cashbook.vo.AutoAccountingRule;
import com.rskj.cashbook.vo.AutoAccountingExecutionLog;
import com.rskj.cashbook.vo.AutoAccountingRuleTemplate;

import java.util.List;
import java.util.Map;

/**
 * 自动记账规则服务接口
 * @author system
 */
public interface AutoAccountingRuleService {
    
    /**
     * 创建规则
     */
    AutoAccountingRule createRule(AutoAccountingRule rule);
    
    /**
     * 更新规则
     */
    AutoAccountingRule updateRule(AutoAccountingRule rule);
    
    /**
     * 删除规则
     */
    boolean deleteRule(String id);
    
    /**
     * 根据ID查询规则
     */
    AutoAccountingRule getRuleById(String id);
    
    /**
     * 查询用户的所有规则
     */
    List<AutoAccountingRule> getUserRules(String userId);
    
    /**
     * 查询启用的规则
     */
    List<AutoAccountingRule> getActiveRules();
    
    /**
     * 启用/禁用规则
     */
    boolean toggleRuleStatus(String id);
    
    /**
     * 执行规则
     */
    AutoAccountingExecutionLog executeRule(String ruleId);
    
    /**
     * 批量执行规则
     */
    List<AutoAccountingExecutionLog> executeRules(List<String> ruleIds);
    
    /**
     * 手动执行规则
     */
    AutoAccountingExecutionLog manualExecuteRule(String ruleId);
    
    /**
     * 计算下次执行时间
     */
    void calculateNextExecuteTime(AutoAccountingRule rule);
    
    /**
     * 验证规则配置
     */
    boolean validateRule(AutoAccountingRule rule);
    
    /**
     * 获取规则执行历史
     */
    List<AutoAccountingExecutionLog> getExecutionHistory(String ruleId);
    
    /**
     * 根据条件查询规则
     */
    List<AutoAccountingRule> searchRules(String ruleName, String ruleType, Boolean isActive, String userId);
    
    /**
     * 获取自动记账规则统计信息
     */
    Map<String, Object> getStats();

    /**
     * 分页查询规则（使用PageHelper）
     */
    com.github.pagehelper.PageInfo<AutoAccountingRule> getRulesWithPageHelper(int pageNumber, int pageSize, String ruleName, String ruleType, Boolean isActive);
    
    /**
     * 分页查询规则（带排序，使用PageHelper）
     */
    com.github.pagehelper.PageInfo<AutoAccountingRule> getRulesWithPageHelperAndSort(int pageNumber, int pageSize, String ruleName, String ruleType, Boolean isActive, String sortBy, String sortOrder);
    
    /**
     * 分页查询用户规则（使用PageHelper）
     */
    com.github.pagehelper.PageInfo<AutoAccountingRule> getUserRulesWithPageHelper(String userId, int pageNumber, int pageSize, String ruleName, String ruleType, Boolean isActive);
    
    /**
     * 分页查询执行日志（使用PageHelper）
     */
    com.github.pagehelper.PageInfo<AutoAccountingExecutionLog> getExecutionLogsWithPageHelper(int pageNumber, int pageSize, String ruleId, String executeResult, String startDate, String endDate);
    
    /**
     * 分页查询模板（使用PageHelper）
     */
    com.github.pagehelper.PageInfo<AutoAccountingRuleTemplate> getTemplatesWithPageHelper(int pageNumber, int pageSize, String category, String keyword);
    
    /**
     * 获取规则模板列表
     */
    List<AutoAccountingRuleTemplate> getRuleTemplates();
    
    /**
     * 根据模板创建规则
     */
    AutoAccountingRule createRuleFromTemplate(String templateId, Map<String, Object> customizations);
    
    /**
     * 批量启用规则
     */
    Map<String, Object> batchEnableRules(List<String> ruleIds);
    
    /**
     * 批量禁用规则
     */
    Map<String, Object> batchDisableRules(List<String> ruleIds);
    
    /**
     * 批量删除规则
     */
    Map<String, Object> batchDeleteRules(List<String> ruleIds);
    
    /**
     * 导出规则配置
     */
    String exportRules(String format);
    
    /**
     * 导入规则配置
     */
    Map<String, Object> importRules(String importData);
    
    /**
     * 检查规则是否有冲突
     */
    List<String> checkRuleConflicts(AutoAccountingRule rule);
    
    /**
     * 获取规则执行建议
     */
    Map<String, Object> getRuleExecutionSuggestions(String ruleId);
    
    /**
     * 暂停规则执行
     */
    boolean pauseRule(String ruleId);
    
    /**
     * 恢复规则执行
     */
    boolean resumeRule(String ruleId);
    
    /**
     * 获取规则执行计划
     */
    List<Map<String, Object>> getRuleExecutionSchedule(String ruleId);
}
